{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "302781df",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tkinter as tk\n",
    "from tkinter import ttk, filedialog, messagebox\n",
    "import threading\n",
    "import time\n",
    "import queue\n",
    "\n",
    "class FileDirectorySelector(tk.Tk):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "\n",
    "        # 窗口配置\n",
    "        self.title(\"文件/目录选择器\")\n",
    "        self.geometry(\"400x300\")\n",
    "        self.configure(bg='#f5f5f5')\n",
    "\n",
    "        # 固定窗口大小，不允许调整\n",
    "        self.resizable(False, False)\n",
    "\n",
    "        # 状态变量\n",
    "        self.selection_type = tk.StringVar(value=\"file\")  # 默认选择文件\n",
    "        self.selected_path = tk.StringVar()  # 存储选择的路径\n",
    "        self.running = False  # 任务运行状态\n",
    "        self.stop_requested = False  # 请求停止的标志\n",
    "\n",
    "        # 创建主框架\n",
    "        main_frame = ttk.Frame(self)\n",
    "        main_frame.pack(expand=True, fill='both', padx=10, pady=10)\n",
    "\n",
    "        # 左侧选择区域\n",
    "        left_frame = ttk.Frame(main_frame)\n",
    "        left_frame.grid(row=0, column=0, sticky='nsew', padx=(0, 10))\n",
    "\n",
    "        # 单选按钮\n",
    "        radio_frame = ttk.Frame(left_frame)\n",
    "        radio_frame.pack(anchor='w', pady=5)\n",
    "\n",
    "        file_radio = ttk.Radiobutton(radio_frame, text=\"文件\", variable=self.selection_type, value=\"file\")\n",
    "        file_radio.pack(side='left', padx=5)\n",
    "\n",
    "        dir_radio = ttk.Radiobutton(radio_frame, text=\"目录\", variable=self.selection_type, value=\"directory\")\n",
    "        dir_radio.pack(side='left', padx=5)\n",
    "\n",
    "        # 输出路径框\n",
    "        self.output_entry = ttk.Entry(left_frame, textvariable=self.selected_path, width=40, state='readonly')\n",
    "        self.output_entry.pack(pady=10)\n",
    "\n",
    "        # 文本输出框\n",
    "        self.text_output = tk.Text(left_frame, height=14, wrap='word', state='normal')\n",
    "        self.text_output.pack(fill='both', expand=True, pady=10)\n",
    "\n",
    "        # 右侧按钮区\n",
    "        right_frame = ttk.Frame(main_frame)\n",
    "        right_frame.grid(row=0, column=1, sticky='ns')\n",
    "\n",
    "        # “选择”按钮\n",
    "        select_button = ttk.Button(right_frame, text=\"选择\", command=self.choose_path)\n",
    "        select_button.pack(pady=5)  # 确保按钮使用 pack 或 grid 布局显示\n",
    "\n",
    "        # “执行/停止”按钮\n",
    "        self.execute_button = ttk.Button(right_frame, text=\"执行\", command=self.toggle_execution)\n",
    "        self.execute_button.pack(pady=5)\n",
    "\n",
    "        # 创建一个队列，用于线程间通信\n",
    "        self.queue = queue.Queue()\n",
    "\n",
    "        # 设置定时检查队列消息\n",
    "        self.after(100, self.process_queue)\n",
    "\n",
    "        # 调整列宽\n",
    "        main_frame.columnconfigure(0, weight=1)\n",
    "        main_frame.columnconfigure(1, weight=0)\n",
    "\n",
    "    def choose_path(self):\n",
    "        \"\"\"选择文件或目录，并设置路径\"\"\"\n",
    "        if self.selection_type.get() == \"file\":\n",
    "            path = filedialog.askopenfilename(title=\"选择文件\")\n",
    "        else:\n",
    "            path = filedialog.askdirectory(title=\"选择目录\")\n",
    "        \n",
    "        if path:\n",
    "            self.selected_path.set(path)\n",
    "\n",
    "    def toggle_execution(self):\n",
    "        \"\"\"切换执行状态\"\"\"\n",
    "        if self.running:\n",
    "            # 如果任务正在运行，请求停止\n",
    "            self.stop_requested = True\n",
    "            self.execute_button.config(text=\"执行\")\n",
    "        else:\n",
    "            # 开始执行任务\n",
    "            self.stop_requested = False\n",
    "            self.execute_button.config(text=\"停止\")\n",
    "            self.start_execution()\n",
    "\n",
    "    def start_execution(self):\n",
    "        \"\"\"开始执行操作\"\"\"\n",
    "        self.running = True\n",
    "        # 启动一个线程来处理长时间运行的任务\n",
    "        threading.Thread(target=self.execute_action, daemon=True).start()\n",
    "\n",
    "    def execute_action(self):\n",
    "        \"\"\"执行长时间运行的任务\"\"\"\n",
    "        try:\n",
    "            if self.selected_path.get():\n",
    "                # 模拟一个长时间运行的任务\n",
    "                for i in range(5):\n",
    "                    if self.stop_requested:  # 检查是否请求停止\n",
    "                        self.queue.put(\"任务已停止。\\n\")\n",
    "                        break\n",
    "                    time.sleep(1)\n",
    "                    self.queue.put(f\"操作进行中: {i+1}/5 完成...\\n\")\n",
    "            else:\n",
    "                self.queue.put(\"请先选择一个文件或目录。\")\n",
    "        finally:\n",
    "            self.running = False\n",
    "            self.queue.put(\"任务完成\\n\" if not self.stop_requested else \"\")\n",
    "            # 恢复按钮为“执行”\n",
    "            self.execute_button.config(text=\"执行\")\n",
    "\n",
    "    def process_queue(self):\n",
    "        \"\"\"处理队列中的消息，并更新GUI\"\"\"\n",
    "        try:\n",
    "            while True:\n",
    "                message = self.queue.get_nowait()\n",
    "                self.text_output.insert(tk.END, message)\n",
    "                self.text_output.see(tk.END)\n",
    "        except queue.Empty:\n",
    "            pass\n",
    "        \n",
    "        # 继续定时检查队列\n",
    "        self.after(100, self.process_queue)\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    app = FileDirectorySelector()\n",
    "    app.mainloop()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "7278cd79",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Exception in thread Thread-45:\n",
      "Traceback (most recent call last):\n",
      "  File \"D:\\ProgramData\\Anaconda3\\lib\\threading.py\", line 980, in _bootstrap_inner\n",
      "    self.run()\n",
      "  File \"D:\\ProgramData\\Anaconda3\\lib\\threading.py\", line 917, in run\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"C:\\Users\\luyingli\\AppData\\Local\\Temp\\ipykernel_11848\\1594905877.py\", line 125, in execute_action\n",
      "  File \"D:\\ProgramData\\Anaconda3\\lib\\tkinter\\__init__.py\", line 1646, in configure\n",
      "    return self._configure('configure', cnf, kw)\n",
      "  File \"D:\\ProgramData\\Anaconda3\\lib\\tkinter\\__init__.py\", line 1636, in _configure\n",
      "    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))\n",
      "RuntimeError: main thread is not in main loop\n"
     ]
    }
   ],
   "source": [
    "import tkinter as tk\n",
    "from tkinter import ttk, filedialog, messagebox\n",
    "import threading\n",
    "import time\n",
    "import queue\n",
    "\n",
    "class FileDirectorySelector(tk.Tk):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "\n",
    "        # 窗口配置\n",
    "        self.title(\"文件/目录选择器\")\n",
    "        self.geometry(\"400x300\")\n",
    "        self.configure(bg='#f5f5f5')\n",
    "\n",
    "        # 固定窗口大小，不允许调整\n",
    "        self.resizable(False, False)\n",
    "\n",
    "        # 状态变量\n",
    "        self.selection_type = tk.StringVar(value=\"file\")  # 默认选择文件\n",
    "        self.selected_path = tk.StringVar()  # 存储选择的路径\n",
    "        self.running = False  # 任务运行状态\n",
    "        self.stop_requested = False  # 请求停止的标志\n",
    "\n",
    "        # 创建主框架\n",
    "        main_frame = ttk.Frame(self)\n",
    "        main_frame.pack(expand=True, fill='both', padx=10, pady=10)\n",
    "\n",
    "        # 左侧选择区域\n",
    "        left_frame = ttk.Frame(main_frame)\n",
    "        left_frame.grid(row=0, column=0, sticky='nsew', padx=(0, 10))\n",
    "\n",
    "        # 单选按钮\n",
    "        radio_frame = ttk.Frame(left_frame)\n",
    "        radio_frame.pack(anchor='w', pady=5)\n",
    "\n",
    "        file_radio = ttk.Radiobutton(radio_frame, text=\"文件\", variable=self.selection_type, value=\"file\")\n",
    "        file_radio.pack(side='left', padx=5)\n",
    "\n",
    "        dir_radio = ttk.Radiobutton(radio_frame, text=\"目录\", variable=self.selection_type, value=\"directory\")\n",
    "        dir_radio.pack(side='left', padx=5)\n",
    "\n",
    "        # 输出路径框\n",
    "        self.output_entry = ttk.Entry(left_frame, textvariable=self.selected_path, width=40, state='readonly')\n",
    "        self.output_entry.pack(pady=10)\n",
    "\n",
    "        # 添加滚动条和文本框\n",
    "        text_frame = ttk.Frame(left_frame)\n",
    "        text_frame.pack(fill='both', expand=True, pady=10)\n",
    "\n",
    "        scrollbar = ttk.Scrollbar(text_frame, orient=\"vertical\")\n",
    "        scrollbar.pack(side=\"right\", fill=\"y\")\n",
    "\n",
    "        self.text_output = tk.Text(text_frame, height=14, wrap='word', yscrollcommand=scrollbar.set)\n",
    "        self.text_output.pack(fill='both', expand=True)\n",
    "        scrollbar.config(command=self.text_output.yview)\n",
    "\n",
    "        # 右侧按钮区\n",
    "        right_frame = ttk.Frame(main_frame)\n",
    "        right_frame.grid(row=0, column=1, sticky='ns')\n",
    "\n",
    "        # “选择”按钮\n",
    "        select_button = ttk.Button(right_frame, text=\"选择\", command=self.choose_path)\n",
    "        select_button.pack(pady=5)  # 确保按钮使用 pack 或 grid 布局显示\n",
    "\n",
    "        # “执行/停止”按钮\n",
    "        self.execute_button = ttk.Button(right_frame, text=\"执行\", command=self.toggle_execution)\n",
    "        self.execute_button.pack(pady=5)\n",
    "\n",
    "        # 创建一个队列，用于线程间通信\n",
    "        self.queue = queue.Queue()\n",
    "\n",
    "        # 设置定时检查队列消息\n",
    "        self.after(100, self.process_queue)\n",
    "\n",
    "        # 调整列宽\n",
    "        main_frame.columnconfigure(0, weight=1)\n",
    "        main_frame.columnconfigure(1, weight=0)\n",
    "\n",
    "    def choose_path(self):\n",
    "        \"\"\"选择文件或目录，并设置路径\"\"\"\n",
    "        if self.selection_type.get() == \"file\":\n",
    "            path = filedialog.askopenfilename(title=\"选择文件\")\n",
    "        else:\n",
    "            path = filedialog.askdirectory(title=\"选择目录\")\n",
    "        \n",
    "        if path:\n",
    "            self.selected_path.set(path)\n",
    "\n",
    "    def toggle_execution(self):\n",
    "        \"\"\"切换执行状态\"\"\"\n",
    "        if self.running:\n",
    "            # 如果任务正在运行，请求停止\n",
    "            self.stop_requested = True\n",
    "            self.execute_button.config(text=\"执行\")\n",
    "        else:\n",
    "            # 开始执行任务\n",
    "            self.stop_requested = False\n",
    "            self.execute_button.config(text=\"停止\")\n",
    "            self.start_execution()\n",
    "\n",
    "    def start_execution(self):\n",
    "        \"\"\"开始执行操作\"\"\"\n",
    "        self.running = True\n",
    "        # 启动一个线程来处理长时间运行的任务\n",
    "        threading.Thread(target=self.execute_action, daemon=True).start()\n",
    "\n",
    "    def execute_action(self):\n",
    "        \"\"\"执行长时间运行的任务\"\"\"\n",
    "        try:\n",
    "            if self.selected_path.get():\n",
    "                # 模拟一个长时间运行的任务\n",
    "                for i in range(5):\n",
    "                    if self.stop_requested:  # 检查是否请求停止\n",
    "                        self.queue.put(\"任务已停止。\\n\")\n",
    "                        break\n",
    "                    time.sleep(1)\n",
    "                    self.queue.put(f\"操作进行中: {i+1}/5 完成...\\n\")\n",
    "            else:\n",
    "                self.queue.put(\"请先选择一个文件或目录。\")\n",
    "        finally:\n",
    "            self.running = False\n",
    "            self.queue.put(\"任务完成\\n\" if not self.stop_requested else \"\")\n",
    "            # 恢复按钮为“执行”\n",
    "            self.execute_button.config(text=\"执行\")\n",
    "\n",
    "    def process_queue(self):\n",
    "        \"\"\"处理队列中的消息，并更新GUI\"\"\"\n",
    "        try:\n",
    "            while True:\n",
    "                message = self.queue.get_nowait()\n",
    "                self.text_output.insert(tk.END, message)\n",
    "                self.text_output.see(tk.END)\n",
    "        except queue.Empty:\n",
    "            pass\n",
    "        \n",
    "        # 继续定时检查队列\n",
    "        self.after(100, self.process_queue)\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    app = FileDirectorySelector()\n",
    "    app.mainloop()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aef1e86e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tkinter as tk\n",
    "from tkinter import ttk, filedialog, messagebox\n",
    "import threading\n",
    "import time\n",
    "import queue\n",
    "\n",
    "class FileDirectorySelector(tk.Tk):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "\n",
    "        # 窗口配置\n",
    "        self.title(\"文件/目录选择器\")\n",
    "        self.geometry(\"400x300\")\n",
    "        self.configure(bg='#f5f5f5')\n",
    "\n",
    "        # 固定窗口大小，不允许调整\n",
    "        self.resizable(False, False)\n",
    "\n",
    "        # 状态变量\n",
    "        self.selection_type = tk.StringVar(value=\"file\")  # 默认选择文件\n",
    "        self.selected_path = tk.StringVar()  # 存储选择的路径\n",
    "        self.running = False  # 任务运行状态\n",
    "        self.stop_requested = False  # 请求停止的标志\n",
    "\n",
    "        # 创建主框架\n",
    "        main_frame = ttk.Frame(self)\n",
    "        main_frame.pack(expand=True, fill='both', padx=10, pady=10)\n",
    "\n",
    "        # 左侧选择区域\n",
    "        left_frame = ttk.Frame(main_frame)\n",
    "        left_frame.grid(row=0, column=0, sticky='nsew', padx=(0, 10))\n",
    "\n",
    "        # 单选按钮\n",
    "        radio_frame = ttk.Frame(left_frame)\n",
    "        radio_frame.pack(anchor='w', pady=5)\n",
    "\n",
    "        file_radio = ttk.Radiobutton(radio_frame, text=\"文件\", variable=self.selection_type, value=\"file\")\n",
    "        file_radio.pack(side='left', padx=5)\n",
    "\n",
    "        dir_radio = ttk.Radiobutton(radio_frame, text=\"目录\", variable=self.selection_type, value=\"directory\")\n",
    "        dir_radio.pack(side='left', padx=5)\n",
    "\n",
    "        # 输出路径框\n",
    "        self.output_entry = ttk.Entry(left_frame, textvariable=self.selected_path, width=40, state='readonly')\n",
    "        self.output_entry.pack(pady=10)\n",
    "\n",
    "        # 添加滚动条和文本框\n",
    "        text_frame = ttk.Frame(left_frame)\n",
    "        text_frame.pack(fill='both', expand=True, pady=10)\n",
    "\n",
    "        scrollbar = ttk.Scrollbar(text_frame, orient=\"vertical\")\n",
    "        scrollbar.pack(side=\"right\", fill=\"y\")\n",
    "\n",
    "        self.text_output = tk.Text(text_frame, height=8, wrap='word', yscrollcommand=scrollbar.set)\n",
    "        self.text_output.pack(fill='both', expand=True)\n",
    "        scrollbar.config(command\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "08dc2dd3",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tkinter as tk\n",
    "from tkinter import ttk, filedialog, messagebox\n",
    "import threading\n",
    "import time\n",
    "import queue\n",
    "\n",
    "class FileDirectorySelector(tk.Tk):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "\n",
    "        # 窗口配置\n",
    "        self.title(\"文件/目录选择器\")\n",
    "        self.geometry(\"500x650\")\n",
    "        self.configure(bg='#f5f5f5')\n",
    "\n",
    "        # 固定窗口大小，不允许调整\n",
    "        self.resizable(False, False)\n",
    "\n",
    "        # 状态变量\n",
    "        self.selection_type = tk.StringVar(value=\"file\")  # 默认选择文件\n",
    "        self.selected_path = tk.StringVar()  # 存储选择的路径\n",
    "        self.running = False  # 任务运行状态\n",
    "        self.stop_requested = False  # 请求停止的标志\n",
    "\n",
    "        # 创建主框架\n",
    "        main_frame = ttk.Frame(self)\n",
    "        main_frame.pack(expand=True, fill='both', padx=10, pady=10)\n",
    "\n",
    "        # 左侧选择区域\n",
    "        left_frame = ttk.Frame(main_frame)\n",
    "        left_frame.grid(row=0, column=0, sticky='nsew', padx=(0, 10))\n",
    "\n",
    "        # 单选按钮\n",
    "        radio_frame = ttk.Frame(left_frame)\n",
    "        radio_frame.pack(anchor='w', pady=5)\n",
    "\n",
    "        file_radio = ttk.Radiobutton(radio_frame, text=\"文件\", variable=self.selection_type, value=\"file\")\n",
    "        file_radio.pack(side='left', padx=5)\n",
    "\n",
    "        dir_radio = ttk.Radiobutton(radio_frame, text=\"目录\", variable=self.selection_type, value=\"directory\")\n",
    "        dir_radio.pack(side='left', padx=5)\n",
    "\n",
    "        # 输出路径框\n",
    "        self.output_entry = ttk.Entry(left_frame, textvariable=self.selected_path, width=60, state='readonly')\n",
    "        self.output_entry.pack(pady=10)\n",
    "\n",
    "        # 添加滚动条和文本框\n",
    "        text_frame = ttk.Frame(left_frame)\n",
    "        text_frame.pack(fill='both', expand=True, pady=10)\n",
    "\n",
    "        scrollbar = ttk.Scrollbar(text_frame, orient=\"vertical\")\n",
    "        scrollbar.pack(side=\"right\", fill=\"y\")\n",
    "\n",
    "        self.text_output = tk.Text(text_frame, height=40, wrap='word', yscrollcommand=scrollbar.set)\n",
    "        self.text_output.pack(fill='both', expand=True)\n",
    "        scrollbar.config(command=self.text_output.yview)\n",
    "\n",
    "        # 右侧按钮区\n",
    "        right_frame = ttk.Frame(main_frame)\n",
    "        right_frame.grid(row=0, column=1, sticky='ns')\n",
    "\n",
    "        # “选择”按钮\n",
    "        select_button = ttk.Button(right_frame, text=\"选择\", command=self.choose_path)\n",
    "        select_button.pack(pady=5)\n",
    "\n",
    "        # “执行/停止”按钮\n",
    "        self.execute_button = ttk.Button(right_frame, text=\"执行\", command=self.toggle_execution)\n",
    "        self.execute_button.pack(pady=5)\n",
    "\n",
    "        # 创建一个队列，用于线程间通信\n",
    "        self.queue = queue.Queue()\n",
    "\n",
    "        # 设置定时检查队列消息\n",
    "        self.after(100, self.process_queue)\n",
    "\n",
    "        # 调整列宽\n",
    "        main_frame.columnconfigure(0, weight=1)\n",
    "        main_frame.columnconfigure(1, weight=0)\n",
    "\n",
    "    def choose_path(self):\n",
    "        \"\"\"选择文件或目录，并设置路径\"\"\"\n",
    "        if self.selection_type.get() == \"file\":\n",
    "            path = filedialog.askopenfilename(title=\"选择文件\")\n",
    "        else:\n",
    "            path = filedialog.askdirectory(title=\"选择目录\")\n",
    "        \n",
    "        if path:\n",
    "            self.selected_path.set(path)\n",
    "\n",
    "    def toggle_execution(self):\n",
    "        \"\"\"切换执行状态\"\"\"\n",
    "        if self.running:\n",
    "            # 如果任务正在运行，请求停止\n",
    "            self.stop_requested = True\n",
    "            self.execute_button.config(text=\"执行\")\n",
    "        else:\n",
    "            # 开始执行任务\n",
    "            self.stop_requested = False\n",
    "            self.execute_button.config(text=\"停止\")\n",
    "            self.start_execution()\n",
    "\n",
    "    def start_execution(self):\n",
    "        \"\"\"开始执行操作\"\"\"\n",
    "        self.running = True\n",
    "        # 启动一个线程来处理长时间运行的任务\n",
    "        threading.Thread(target=self.execute_action, daemon=True).start()\n",
    "\n",
    "    def execute_action(self):\n",
    "        \"\"\"执行长时间运行的任务\"\"\"\n",
    "        try:\n",
    "            if self.selected_path.get():\n",
    "                # 模拟一个长时间运行的任务\n",
    "                for i in range(5):\n",
    "                    if self.stop_requested:  # 检查是否请求停止\n",
    "                        self.queue.put(\"任务已停止。\\n\")\n",
    "                        break\n",
    "                    time.sleep(1)\n",
    "                    self.queue.put(f\"操作进行中: {i+1}/5 完成...\\n\")\n",
    "            else:\n",
    "                self.queue.put(\"请先选择一个文件或目录。\")\n",
    "        finally:\n",
    "            self.running = False\n",
    "            self.queue.put(\"任务完成\\n\" if not self.stop_requested else \"\")\n",
    "            # 恢复按钮为“执行”\n",
    "            self.queue.put(\"update_button\")\n",
    "\n",
    "    def process_queue(self):\n",
    "        \"\"\"处理队列中的消息，并更新GUI\"\"\"\n",
    "        try:\n",
    "            while True:\n",
    "                message = self.queue.get_nowait()\n",
    "                if message == \"update_button\":\n",
    "                    self.execute_button.config(text=\"执行\")\n",
    "                else:\n",
    "                    self.text_output.insert(tk.END, message)\n",
    "                    self.text_output.see(tk.END)\n",
    "        except queue.Empty:\n",
    "            pass\n",
    "        \n",
    "        # 继续定时检查队列\n",
    "        self.after(100, self.process_queue)\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    app = FileDirectorySelector()\n",
    "    app.mainloop()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2da64a27",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "26f38c11",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
